﻿using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using pttk_htt_hr.Constant;
using pttk_htt_hr.DAO;
using pttk_htt_hr.Utility;

namespace pttk_htt_hr.DAO
{
    class BLogicAction
    {
        /// <summary>
        /// 
        /// </summary>
        /// <param name="LstSqlParameters"></param>
        /// <param name="LstExistedObj">Danh sách obj được lấy từ DB</param>
        /// <param name="MainKeys">Tham số phải có @</param>
        /// <returns></returns>
        public static int Update_Case_AddRow(List<List<SqlParameter>> parameters, List<Dictionary<string, string>> LstExistedObj, string[] MainKeys)
        {
            DBMS dbms = new DBMS();
            dbms.Connect();

            int result = 0; // Mặc định là OK

            int InsertResult = 0; // Lưu kết quả insert
            int UpdateResult = 0; // Lưu kết quả update

            for (int i = 0; i < parameters.Count; i++)
            {
                // Với mỗi danh sách SqlParameter thì
                List<SqlParameter> LstSqlParameter = parameters.ElementAt(i);

                // Lấy những Key Chính (là những key mà có thể suy ra được khóa chính) VD: @MaTD, @MaPLTDTT -> MaCTPLTDTT
                Dictionary<string, string> MatchedKeys = DictionaryUtil.Extract_ParamVal_In_ListSqlparameter(LstSqlParameter, MainKeys);

                // Xóa @ ra khỏi MatchedKeys
                MatchedKeys = DictionaryUtil.Remove_Amoc_In_Dictionary(MatchedKeys);

                // Với mỗi tập Key chính, đi tìm trong DB
                bool hasExisted = false;
                for (int existedObj = 0; existedObj < LstExistedObj.Count; existedObj++)
                {
                    Dictionary<string, string> dic = LstExistedObj.ElementAt(existedObj);

                    /*
                     * Giả sử dic có 2 key: @MaTD, @MaPLTDTT
                     * thì phải đảm bảo 2 key trên cùng match trong DB
                     * 
                     */
                    int count = 0;
                    foreach (var item in MainKeys)
                    {
                        string key = item.Replace("@", "").ToString();
                        if (MatchedKeys[key].Equals(dic[key]))
                            count++;
                    }

                    if (count == MainKeys.Length)// Matched
                    {
                        // Tiến hành cập nhật
                        // Update: @SoLuong, @MaTD, @MaPLTDTT
                        List<SqlParameter> TempParam_1 = SqlParameterUitl.Remove_SqlParameter_Unnecessary(LstSqlParameter, new[] { ParameterConstant.MaPLTDTT, ParameterConstant.MaTD, ParameterConstant.SOLUONG });
                        UpdateResult = dbms.ExcuteProcedure_InsertUpdateDelete_Int(StoreProcedureConstant.SP_UPDATE_CHI_TIET_PHIEU_LAP_TD_TUAN_TOI, TempParam_1.ToArray());

                        // Thông báo là đã cập nhật
                        hasExisted = true;

                        break;
                    }
                }// LstExistedObj Loop

                // Tìm mà không thấy tồn tại trong DB thì Insert
                if (hasExisted == false)
                {
                    // Tiến hành thêm vào
                    // Insert: @SoLuong, @MaTD, @MaPLTDTT

                    List<SqlParameter> TempParam_2 = SqlParameterUitl.Remove_SqlParameter_Unnecessary(LstSqlParameter, new[] { ParameterConstant.MaPLTDTT, ParameterConstant.MaTD, ParameterConstant.SOLUONG });
                    InsertResult = dbms.ExcuteProcedure_InsertUpdateDelete_Int(StoreProcedureConstant.SP_INSERT_CHI_TIET_PHIEU_LAP_TD_TUAN_TOI, TempParam_2.ToArray());
                }
            }//End For loop

            dbms.Disconnect();

            // return result
            if ((InsertResult != 0) || (UpdateResult != 0))
            {
                result = -1;
            }
            return result;

        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="LstSqlParameters"></param>
        /// <param name="LstExistedObj">Danh sách obj được lấy từ DB</param>
        /// <param name="MainKeys">Tham số phải có @</param>
        /// <returns></returns>
        public static int Update_Case_DeleteRow(List<List<SqlParameter>> LstSqlParameters, List<Dictionary<string, string>> LstExistedObj, string[] MainKeys)
        {
            DBMS dbms = new DBMS();
            dbms.Connect();

            int result = 0; // Mặc định là OK

            int InsertResult = 0; // Lưu kết quả insert
            int DeleteResult = 0; // Lưu kết quả delete

            // Khác với Update_Case_AddRow sẽ duyệt ngược lại
            for (int dbRowI = 0; dbRowI < LstExistedObj.Count; dbRowI++)
            {
                // Với mỗi danh sách Dictionary<string, string> dic thì
                Dictionary<string, string> dataRowI = LstExistedObj.ElementAt(dbRowI);

                Dictionary<string, string> MatchedKeys = DictionaryUtil.Extract_ParamVal_By_ParamName_From_Dictionary(dataRowI, MainKeys);

                List<SqlParameter> LstSqlParameter;
                List<SqlParameter> LstSqlParameterTemp = null;

                // Với mỗi tập Key chính, đi tìm trong DB
                bool hasExisted = false;

               



                for (int j = 0; j < LstSqlParameters.Count; j++)
                {
                    LstSqlParameter = LstSqlParameters.ElementAt(j);

                    LstSqlParameterTemp = LstSqlParameter;

                    // Tìm từng dòng
                    int count = 0;

                    foreach (var item in MainKeys)
                    {
                        string key = item.Replace("@", "").ToString();

                        string db_Val = MatchedKeys[key];


                        for (int sqlParmI = 0; sqlParmI < LstSqlParameter.Count; sqlParmI++)
                        {
                            SqlParameter SqlParameterI = LstSqlParameter[sqlParmI];
                            string reqI_Val = SqlParameterI.Value.ToString();

                            if (reqI_Val.Equals(db_Val))
                            {
                                count++;
                                break;
                            }
                        } // End sqlParmI
                    } // Đã tìm hết 1 dòng

                    if (count == MatchedKeys.Count)
                    {
                        hasExisted = true;
                        break; // Thoát khỏi loop LstSqlParameters.Count
                    }
                }


                // Kiểm tra có tồn tại chưa
                if (hasExisted) // Tiến hành cập nhật
                {
                    // Update: @SoLuong, @MaTD, @MaPLTDTT
                    List<SqlParameter> TempParam_1 = SqlParameterUitl.Remove_SqlParameter_Unnecessary(LstSqlParameterTemp, new[] { ParameterConstant.MaPLTDTT, ParameterConstant.MaTD, ParameterConstant.SOLUONG });
                    result = dbms.ExcuteProcedure_InsertUpdateDelete_Int(StoreProcedureConstant.SP_UPDATE_CHI_TIET_PHIEU_LAP_TD_TUAN_TOI, TempParam_1.ToArray());
                }

                // Tìm mà không thấy tồn tại trong DB thì Insert
                else// Tiến hành xóa đi
                {
                    //Chuyển Dictionary -> List<SqlParameter>
                    // Dictionary là datasource lấy từ db
                    List<SqlParameter> TempParam = SqlParameterUitl.Convert_Dictionary_To_ListSqlparameter(dataRowI);

                    // Delete: @MaTD, @MaPLTDTT
                    List<SqlParameter> TempParam_2 = SqlParameterUitl.Remove_SqlParameter_Unnecessary(TempParam, new[] { ParameterConstant.MaPLTDTT, ParameterConstant.MaTD });

                    // Delete
                    DeleteResult = dbms.ExcuteProcedure_InsertUpdateDelete_Int(StoreProcedureConstant.SP_DELETE_CHI_TIET_PHIEU_LAP_TD_TUAN_TOI_BY_MaPLTDTT_MaTD, TempParam_2.ToArray());
                }


            }//LstExistedObj loop

            dbms.Disconnect();

            // return result
            if ((InsertResult != 0) || (DeleteResult != 0))
            {
                result = -1;
            }
            return result;

        }
    }
}
